#include "myitemview.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QTextEdit>
#include <QScrollArea>
#include <QScrollBar>
#include <QDebug>
#include <QGroupBox>
#include <QRadioButton>
#include <QAbstractButton>
#include <QCheckBox>
#include "sd.h"

MyItemView::MyItemView(QWidget *parent) :
		QAbstractItemView(parent){
	items = new QWidget(viewport());
	l = new QVBoxLayout(items);
	question = new QLabel(items);
	l->addWidget(question);
	question->setWordWrap(true);
	question->setAlignment(Qt::AlignLeft | Qt::AlignTop);

//	answer = new QGroupBox(trUtf8("qqq"), sa2->viewport());
//	sa2->setWidget(answer);

	question->setText(trUtf8("Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос Вопрос "));

//	update();
	updateGeometries();
//	connect(this, SIGNAL(Changed()), SLOT(Change()));
}

void MyItemView::scrollTo ( const QModelIndex & index, ScrollHint){
	QRect area = viewport()->rect();
	QRect rect = visualRect(index);

	if (rect.left() < area.left())
			horizontalScrollBar()->setValue(
					horizontalScrollBar()->value() + rect.left() - area.left());
	else if (rect.right() > area.right())
			horizontalScrollBar()->setValue(
					horizontalScrollBar()->value() + qMin(
							rect.right() - area.right(), rect.left() - area.left()));

	if (rect.top() < area.top())
			verticalScrollBar()->setValue(
					verticalScrollBar()->value() + rect.top() - area.top());
	else if (rect.bottom() > area.bottom())
			verticalScrollBar()->setValue(
					verticalScrollBar()->value() + qMin(
							rect.bottom() - area.bottom(), rect.top() - area.top()));

	update();
}

QRect MyItemView::visualRect ( const QModelIndex & index) const{
	if(index == rootIndex())
		return question->rect();
	else if(Conformity.contains(index))
		return Conformity.value(index)->rect();

	return QRect(0, 0, 0, 0);
}

bool MyItemView::isIndexHidden( const QModelIndex &) const{
	// Элементы нельзя скрыть.
	return false;

}

QModelIndex	MyItemView::moveCursor( CursorAction, Qt::KeyboardModifiers){
	return currentIndex();
}

void MyItemView::setSelection( const QRect &, QItemSelectionModel::SelectionFlags){
	// Элементы не выделяются.
}

QRegion	MyItemView::visualRegionForSelection ( const QItemSelection &) const{
	// Элементы не выделяются.
	return QRegion();
}

QModelIndex	MyItemView::indexAt( const QPoint & point) const{
	QList<QModelIndex> keys = Conformity.keys();
	if (question->rect().contains(point))
		return rootIndex();
	else
		for(int i = 0; i < Conformity.size(); ++i)
			if (Conformity.value(keys.at(i))->rect().contains(point))
				return keys.at(i);

	return QModelIndex();
}

int	MyItemView::horizontalOffset() const{
	return horizontalScrollBar()->value();
}

int	MyItemView::verticalOffset() const{
	return verticalScrollBar()->value();
}

void MyItemView::setRootIndex ( const QModelIndex & i){
	QAbstractItemView::setRootIndex(i);

	question->setText(rootIndex().data().toString());
	int type = model()->index(rootIndex().row(), 1).data().toInt();
	QList<QModelIndex> keys = Conformity.keys();
	for(int i = 0; i < Conformity.size(); ++i)
		delete (Conformity.value(keys.at(i)));
	Conformity.clear();
	if(type == 0){
		constr<QRadioButton>(new QGroupBox(items));
	}else if(type == 1){
		constr<QCheckBox>(new QGroupBox(items));
	}else if(type == 2){
		QTextEdit * te = new QTextEdit(model()->index(0, 1, rootIndex()).data().toString(), items);
		l->addWidget(te);
		Conformity.insert(model()->index(0, 1, rootIndex()), te);
		connect(te, SIGNAL(textChanged()), SLOT(Change()));
	}

	update();
}

void MyItemView::updateGeometries(){
	horizontalScrollBar()->setPageStep(viewport()->width());
	horizontalScrollBar()->setRange(0, qMax(0, items->width() - viewport()->width()));
	verticalScrollBar()->setPageStep(viewport()->height());
	verticalScrollBar()->setRange(0, qMax(0, items->height() - viewport()->height()));
//	qDebug()<<trUtf8("question %1").arg(items->height());
//	qDebug()<<trUtf8("viewport %1").arg(viewport()->height());
}

void MyItemView::resizeEvent(QResizeEvent * ){
//	items->setFixedWidth(viewport()->width());
//	qDebug()<<trUtf8("viewport %1").arg(viewport()->width());
//	qDebug()<<trUtf8("items %1").arg(items->width());
	updateGeometries();
}

void MyItemView::scrollContentsBy(int dx, int dy){
	viewport()->scroll(dx, dy);
}

void MyItemView::dataChanged(const QModelIndex &, const QModelIndex &){
//	question->setText(rootIndex().data().toString());
//	int type = model()->index(rootIndex().row(), 1).data().toInt();
//	if(type == 0){
//		sa2->setWidget(constr<QRadioButton>(new QGroupBox(sa2->viewport())));
//	}else if(type == 1){
//		sa2->setWidget(constr<QCheckBox>(new QGroupBox(sa2->viewport())));
//	}else if(type == 2){
//		QTextEdit * te = new QTextEdit(this);
//		te->setText(model()->index(0, 1, rootIndex()).data().toString());
//		sa2->setWidget(te);
//	}
}

template < typename Type >
QWidget * MyItemView::constr(QWidget *parent){
	const QAbstractItemModel * m = model();
	QModelIndex index;
	QAbstractButton * b;
	for(int i = 0; i < m->rowCount(rootIndex()); ++i){
		index = m->index(i, 0, rootIndex());
		b = new Type(index.data().toString(), parent);
		b->setChecked(model()->index(i, 1, rootIndex()).data().toBool());
		Conformity.insert(index, b);
		l->addWidget(b);
		connect(b, SIGNAL(clicked()), SLOT(Change()));
	}

	return parent;
}


void MyItemView::Change(){
	int type = model()->index(rootIndex().row(), 1).data().toInt();
	if(type == 0 || type == 1){
		QList<QModelIndex> keys = Conformity.keys();
		for(int i = 0; i < Conformity.size(); ++i)
			if(QAbstractButton * b = qobject_cast<QAbstractButton *>(Conformity.value(keys.at(i)))){
				sd(model(), i, 1, b->isChecked(), rootIndex());
			}else
				qDebug()<<trUtf8("Не получается привести тип кнопки");
	}else if(type == 2){
		if(QTextEdit * te = qobject_cast<QTextEdit *>(Conformity.value(Conformity.keys().at(0)))){
			if(model()->rowCount(rootIndex()) == 0)
				model()->insertRow(0, rootIndex());
			sd(model(), 0, 1, te->toPlainText(), rootIndex());
		}else
			qDebug()<<trUtf8("Не получается привести тип редактора текста");
	}
}
